﻿using System;
using System.Globalization;
using System.Linq;
using System.Web.Mvc;
using log4net;
using MSDAL;
using MSWeb.Models;
using MSWEB.Implementation;
using PagedList;
using MSWeb.Implementation;

namespace MSWeb.Controllers
{
    public class SchedulesController : Controller
    {
        readonly ILog _loger = LogManager.GetLogger(typeof(SchedulesController));
        private readonly MSEntities _db;
        private readonly DataRepository _dataRepo;
        private readonly ScheduleCalculator _scheduler;

        public SchedulesController()
        {
            _db = new MSEntities();
            _dataRepo = new DataRepository();
            _scheduler = new ScheduleCalculator();
        }
        
        [Authorize]
        public ActionResult Index(int? page)
        {
            try
            {
                var pageNumber = (page ?? 1);
                return View(_db.PowtorzeniaLekcji
                    .OrderBy(i => i.IDPowtorzenia)
                    .ToPagedList(pageNumber, ApplicationSettings.PageSize));
            }
            catch (Exception ex)
            {
                TempData["Error"] = "Wystapił nieoczekiwany błąd.";
                return RedirectToAction("Index");
            }
        }

        [Authorize]
        public ActionResult Edit(int? id)
        {
            try
            {
                if (!id.HasValue)
                {
                    TempData["Error"] = "Nieodnaleziono podanego rekordu";
                    return RedirectToAction("Index");
                }
                if (_db.PowtorzeniaLekcji.Any(i => i.IDPowtorzenia == id))
                {
                    var editedLesson = _db.PowtorzeniaLekcji
                        .First(i => i.IDPowtorzenia == id);
                    ViewBag.IDNauczyciela = _dataRepo.GetNauczyciele();                    
                    ViewBag.IDUcznia = _dataRepo.GetUczniowie();
                    //ViewBag.IDUcznia = _dataRepo.GetNameAndSurnameForStudent(editedLesson.IDUcznia.Value);
                    //ViewBag.IDNauczyciela = _dataRepo.GetNameAndSurnameForTeacher(editedLesson.IDNauczyciela);
                    ViewBag.IDSali = new SelectList(_db.Sale, "IDSali", "NazwaSali");
                    return PartialView("_EdycjaSchedules", editedLesson);
                }
                TempData["Error"] = "Nieodnaleziono podanego rekordu";
                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                TempData["Error"] = "Nieodnaleziono podanego rekordu";
                return RedirectToAction("Index");
            }
        }

        [Authorize]
        public ActionResult Tworzenie()
        {
            ViewBag.IDInstrumentu = new SelectList(_db.Instrumenty, "IDInstrumentu", "NazwaInstrumentu");
            ViewBag.IDNauczyciela = _dataRepo.GetNauczyciele();
            ViewBag.IDSali = new SelectList(_db.Sale, "IDSali", "NazwaSali");
            ViewBag.IDUcznia = _dataRepo.GetUczniowie();
            return PartialView("_TworzenieHarmonogramu");
        }

        [HttpPost]
        [Authorize]
        [ValidateAntiForgeryToken]
        public ActionResult Create(NewScheduleModel powtorzenie)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    if (powtorzenie.DataPoczatkowaICzas
                        .ToString(CultureInfo.InvariantCulture)== "")
                    {
                        TempData["Error"] = "Podaj date poczatkowa i czas rozpoczęcia lekcji.";
                        return RedirectToAction("Index");
                    }
                    if (!powtorzenie.KosztLekcji.HasValue)
                    {
                        TempData["Error"] = "Podaj koszt lekcji.";
                        return RedirectToAction("Index");
                    }
                    if (!powtorzenie.CzasTrwaniaLekcji.HasValue)
                    {
                        TempData["Error"] = "Podaj czas trwania lekcji.";
                        return RedirectToAction("Index");
                    }
                    if (powtorzenie.DataWaznosci.ToString(CultureInfo.InvariantCulture)== "")
                    {
                        TempData["Error"] = "Podaj date waznosci harmonogramu.";
                        return RedirectToAction("Index");
                    }
                    if (_scheduler.AddScheduleWithLessonInTransaction(powtorzenie) == false)
                    {
                        TempData["Error"] = "Wystąpił bląd podczas dodawania lekcji.";
                        return RedirectToAction("Index");
                    }
                }
                else
                {
                    TempData["Error"] = "Wystapił błąd podczas dodawania wpisu.";
                    return RedirectToAction("Index");
                }
                TempData["Error"] = "Powtórzenie dodane poprawnie.";
                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                TempData["Error"] = "Wystapił błąd podczas dodawania wpisu!.";
                _loger.Error(ex.Message);
                _loger.Error(ex.InnerException);
                return RedirectToAction("Index");
            }
        }

        [HttpPost]
        [Authorize]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(PowtorzeniaLekcji powtorzenie)
        {
            try
            {
                _db.PowtorzeniaLekcji.Attach(powtorzenie);
                _db.Entry(powtorzenie).Property(i => i.Czas).IsModified = true;
                _db.Entry(powtorzenie).Property(i => i.IDSali).IsModified = true;
                _db.Entry(powtorzenie).Property(i => i.KosztLekcji).IsModified = true;
                _db.Entry(powtorzenie).Property(i => i.CzasTrwaniaLekcji).IsModified = true;
                _db.Entry(powtorzenie).Property(i => i.IDNauczyciela).IsModified = true;
                _db.Entry(powtorzenie).Property(i => i.IDUcznia).IsModified = true;
                _db.Entry(powtorzenie).Property(i => i.DataWaznosci).IsModified = true;
                _db.SaveChanges();
                TempData["Error"] = "Edycja powtorzenia- OK.";
            }
            catch (Exception ex)
            {
                TempData["Error"] = "Błąd podczas edytowania lekcji.";
            }
            return RedirectToAction("Index");
        }
    }
}